Use set_callbacks hypercall if callback_op is not available.
authorIan.Campbell@xensource.com <Ian.Campbell@xensource.com>
Fri, 21 Apr 2006 16:18:53 +0000 (17:18 +0100)
committerIan.Campbell@xensource.com <Ian.Campbell@xensource.com>
Fri, 21 Apr 2006 16:18:53 +0000 (17:18 +0100)
Signed-off-by: Ian Campbell <ian.campbell@xensource.com>
linux-2.6-xen-sparse/include/asm-i386/mach-xen/setup_arch_post.h
linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/setup_arch_post.h

index 71d0258b8d36c4783340383505cbaaf4bdbbc2a3..5107aacd4d70f9fb7fb9b04158ed97e1455fad74 100644 (file)
@@ -24,6 +24,7 @@ extern void nmi(void);
 
 static void __init machine_specific_arch_setup(void)
 {
+       int ret;
        struct xen_platform_parameters pp;
        struct callback_register event = {
                .type = CALLBACKTYPE_event,
@@ -42,8 +43,14 @@ static void __init machine_specific_arch_setup(void)
                memset(empty_zero_page, 0, sizeof(empty_zero_page));
        }
 
-       HYPERVISOR_callback_op(CALLBACKOP_register, &event);
-       HYPERVISOR_callback_op(CALLBACKOP_register, &failsafe);
+       ret = HYPERVISOR_callback_op(CALLBACKOP_register, &event);
+       if (ret == 0)
+               ret = HYPERVISOR_callback_op(CALLBACKOP_register, &failsafe);
+       if (ret == -ENOSYS)
+               ret = HYPERVISOR_set_callbacks(
+                       event.address.cs, event.address.eip,
+                       failsafe.address.cs, failsafe.address.eip);
+       BUG_ON(ret);
 
        cb.handler_address = (unsigned long)&nmi;
        HYPERVISOR_nmi_op(XENNMI_register_callback, &cb);
index f2342b00977eeff496de3919c4e34207ff701bd1..725ea90c0358a973395977ceb055bfe30c2d4978 100644 (file)
@@ -14,6 +14,7 @@ extern void nmi(void);
 
 static void __init machine_specific_arch_setup(void)
 {
+       int ret;
        struct callback_register event = {
                .type = CALLBACKTYPE_event,
                .address = (unsigned long) hypervisor_callback,
@@ -30,9 +31,17 @@ static void __init machine_specific_arch_setup(void)
        struct xennmi_callback cb;
 #endif
 
-       HYPERVISOR_callback_op(CALLBACKOP_register, &event);
-       HYPERVISOR_callback_op(CALLBACKOP_register, &failsafe);
-       HYPERVISOR_callback_op(CALLBACKOP_register, &syscall);
+       ret = HYPERVISOR_callback_op(CALLBACKOP_register, &event);
+       if (ret == 0)
+               ret = HYPERVISOR_callback_op(CALLBACKOP_register, &failsafe);
+       if (ret == 0)
+               ret = HYPERVISOR_callback_op(CALLBACKOP_register, &syscall);
+       if (ret == -ENOSYS)
+               ret = HYPERVISOR_set_callbacks(
+                       event.address,
+                       failsafe.address,
+                       syscall.address);
+       BUG_ON(ret);
 
 #ifdef CONFIG_X86_LOCAL_APIC
        cb.handler_address = (unsigned long)&nmi;